package utils;

/**
 * Permet de calculer le checksum d'un nombre binaire ainsi que de verifier
 * qu'un nombre binaire se soumet au regle du CRC, donc s'il presente une
 * erreur.
 * 
 * @author Bertholet Damien & Daoust Julien
 */
public class CRC {

	/**
	 * Calcul la valeur du checksum par rapport au polynome generateur en
	 * utilisant CRC.
	 * 
	 * @param binaryString
	 *            Les donnees sous forme binaire.
	 * @param polynome
	 *            Le polynome generateur sous forme binaire.
	 * @return Retourne la valeur du CRC par rapport au polynome generateur.
	 */
	public static String calculCheksum(String binaryString, String polynome) {
		int cheksumSize = polynome.length() - 1;

		// On ajoute les zeros a droit des donnees.
		String binaryData = BinaryOperation.mulBy2(binaryString, cheksumSize);
		return BinaryOperation.ajustSize(CRC.calculRest(binaryData, polynome),
		        cheksumSize);
	}

	/**
	 * Indique si les donnees+checksum sont correctes. On effectue la division
	 * binaire entre 'data_crc' et le polynome, si le resultat est 0, il n'y a
	 * pas d'erreur.
	 * 
	 * @param data_checksum
	 *            Les donnees + la valeur du checksum des donnees par le
	 *            polynome generateur sous forme binaire.
	 * @param polynome
	 *            Le polynome generateur sous forme binaire.
	 * @return True si la division ne donne pas 0. ; False sinon.
	 */
	public static boolean hasError(String data_checksum, String polynome) {
		// Pour savoir si le reste est 0, il suffit d'enlever tous les zeros de
		// la string et de regarder la taille. Car une String binaire pourrait
		// etre '0000' par exemple, on ne peut donc pas regarder la taille
		// uniquement.
		return CRC.calculRest(data_checksum, polynome).indexOf("1") != -1;
	}

	/**
	 * Calcul le reste de la division entre la string binaire et le polynome
	 * generateur.
	 * 
	 * @param binaryString
	 *            La string binaire a diviser.
	 * @param polynome
	 *            Le polynome generateur sous forme binaire.
	 * @return Le reste de la division.
	 */
	private static String calculRest(String binaryString, String polynome) {
		binaryString = BinaryOperation.removeLeftZero(binaryString);

		if(binaryString.length() < polynome.length())
			return binaryString;

		return CRC.calculRest(BinaryOperation.XoR(binaryString, polynome),
		        polynome);
	}
}